package com.googlecode.spoluyan.myshows;

import java.util.Map;
import java.util.Set;

import com.googlecode.spoluyan.myshows.Defines.Command;
import com.googlecode.spoluyan.myshows.Defines.Gender;
import com.googlecode.spoluyan.myshows.Defines.Status;
import com.googlecode.spoluyan.myshows.data.Episode;
import com.googlecode.spoluyan.myshows.data.Genre;
import com.googlecode.spoluyan.myshows.data.News;
import com.googlecode.spoluyan.myshows.data.Profile;
import com.googlecode.spoluyan.myshows.data.ProfileShow;
import com.googlecode.spoluyan.myshows.data.SearchByFileResult;
import com.googlecode.spoluyan.myshows.data.SearchShow;
import com.googlecode.spoluyan.myshows.data.ShowWithEpisodes;
import com.googlecode.spoluyan.myshows.data.TopRatedShow;

public interface IClient {
    Set<ProfileShow> getShows() throws MyShowsClientException;

    Set<Episode> getWatchedEpisodes(Long showId) throws MyShowsClientException;

    Set<Episode> getUnwatchedEpisodes() throws MyShowsClientException;

    Set<Episode> getNextEpisodes() throws MyShowsClientException;

    void checkEpisode(Long episodeId, Short rating) throws MyShowsClientException;

    void uncheckEpisode(Long episodeId) throws MyShowsClientException;

    void syncEpisodesFull(Long showId, Long[] episodesIds) throws MyShowsClientException;

    void syncEpisodesDelta(Long showId, Long[] check, Long[] uncheck) throws MyShowsClientException;

    void updateShowStatus(Long showId, Status status) throws MyShowsClientException;

    void updateShowRating(Long showId, Short rating) throws MyShowsClientException;

    void updateEpisodeRating(Long episodeId, Short rating) throws MyShowsClientException;

    Set<Long> getFavoritesEpisodesList() throws MyShowsClientException;

    void updateFavoritesEpisodesList(Command cmd, Long episodeId) throws MyShowsClientException;

    Set<Long> getIgnoredEpisodesList() throws MyShowsClientException;

    void updateIgnoredEpisodesList(Command cmd, Long episodeId) throws MyShowsClientException;

    Map<String, Set<News>> getFriendsNews() throws MyShowsClientException;

    Set<SearchShow> search(String query) throws MyShowsClientException;

    SearchByFileResult searchByFile(String fileName) throws MyShowsClientException;

    ShowWithEpisodes getShowInformation(Long showId) throws MyShowsClientException;

    Set<Genre> getGenres() throws MyShowsClientException;

    Set<TopRatedShow> getShowsRating(Gender gender) throws MyShowsClientException;

    Profile getUsersProfile(String login) throws MyShowsClientException;
}
